package com.ldg.cart.service.impl;

import com.alibaba.fastjson.JSON;
import com.ldg.cart.client.ManagerClient;
import com.ldg.cart.entity.ItemEntity;
import com.ldg.cart.entity.TbOrderItem;
import com.ldg.cart.entity.group.Cart;
import com.ldg.cart.service.CartService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * @Author: Liudao
 * @Date: 2022-10-17-14:40
 * @Description:
 */
@Service
public class CartServiceImpl implements CartService {
    @Autowired
    private StringRedisTemplate redisTemplate;
    @Autowired
    private ManagerClient managerClient;

    //1. 添加到购物车
    @Override
    public List<Cart> addCart(String name, String sellerId, int num) {
        //1.1 根据sku商品id查询出sku商品对象
        ItemEntity item = managerClient.findById(sellerId);
        //1.2 从redis中取得购物车列表
        String cartListStr = redisTemplate.opsForValue().get(name);
        if(StringUtils.isBlank(cartListStr)){
            cartListStr = "[]";
        }
        List<Cart> cartList = JSON.parseArray(cartListStr, Cart.class);
        //1.3 根据sellerid在购物车列表中查询是否有对应的购物车
        Cart cart = findCartBySellerId(cartList,item.getSellerId());
        //1.4 如果存在此购物车，就添加商品到购物车中，如果不存在，就新建一个购物车并添加到购物车列表中
        if(cart == null){           // 没有此购物车
            //1.4.1 创建新的购物车
            cart = createCart(item,num);
            //1.4.2 将此购物车添加到购物车列表中
            cartList.add(cart);
        }else{                      // 有此购物车
            //1.5 判断此商品是否存在于此购物车
            TbOrderItem orderItem = findOrderItem(item,cart.getOrderItemList());
            //1.5.1 如果存在此商品，就修改它的购买数量与小计
            if(orderItem != null){
                orderItem.setNum(orderItem.getNum() + num);     // 修改数量
                orderItem.setTotalFee(item.getPrice().multiply(new BigDecimal(orderItem.getNum())));
            }else{//1.5.2 如果不存在此商品，就创建一个商品并添加此购物车中
                orderItem = createOrderItem(item, num);
                cart.getOrderItemList().add(orderItem);
            }

            //1.6 最后，对一些兼容的情况处理
            //1.6.1 如果购物车中某件商品的数量为0，就从购物车的购物项列表中移除此商品
            if(orderItem.getNum() == 0){
                cart.getOrderItemList().remove(orderItem);
            }
            //1.6.2 如果购物车中的购物项列表长度为0，此时就移除购物车
            if(cart.getOrderItemList().size() == 0){
                cartList.remove(cart);
            }

        }
        //1.7 添加商品到redis中
        redisTemplate.opsForValue().set(name,JSON.toJSONString(cartList),10, TimeUnit.DAYS);
        return cartList;
    }

    //2. 根据sellerId查询是否有对应的购物车
    private Cart findCartBySellerId(List<Cart> cartList,String sellerId) {
        for (Cart cart : cartList) {
            if(sellerId.equals(cart.getSellerId())){
                return cart;
            }
        }
        return null;
    }
    //3. 创建新的购物车
    private Cart createCart(ItemEntity item, int num) {
        //3.1 创建一个新的购物车对象
        Cart cart = new Cart();
        cart.setSellerId(item.getSellerId());           // 商家id
        cart.setSellerName(item.getSeller());           // 商家名称
        //3.2 购造商品列表对象
        List<TbOrderItem> orderItemList = new ArrayList<>();
        //3.3 根据item对象创建TbOrderItem对象
        TbOrderItem orderItem = createOrderItem(item,num);
        //3.4 向购物项列表集合添加商品
        orderItemList.add(orderItem);
        //3.5 将上面的购物项集合赋值给cart对象
        cart.setOrderItemList(orderItemList);
        //3.6 返回购物车
        return cart;
    }

    //4. 创建购物项
    private TbOrderItem createOrderItem(ItemEntity item, int num) {
        //4.1 创建购物项对象
        TbOrderItem orderItem = new TbOrderItem();
        //4.2 为此对象各个属性赋值
        orderItem.setItemId(item.getId());
        orderItem.setNum(num);
        orderItem.setPrice(item.getPrice());
        orderItem.setSellerId(item.getSellerId());
        orderItem.setTitle(item.getTitle());
        orderItem.setPicPath(item.getImage());
        orderItem.setTotalFee(item.getPrice().multiply(new BigDecimal(num)));    // 小计
        //4.3 返回
        return orderItem;
    }

    //5. 根据itemId,查询是否存在此商品
    private TbOrderItem findOrderItem(ItemEntity item,List<TbOrderItem> orderItems) {
        for (TbOrderItem orderItem : orderItems) {
            if(orderItem.getItemId().longValue() == item.getId().longValue()){
                return orderItem;
            }
        }
        return  null;
    }
}
